package com.spzx.product.service;

import com.spzx.product.api.domain.SkuPrice;
import com.spzx.product.api.domain.SkuQuery;
import com.spzx.product.api.domain.Product;
import com.baomidou.mybatisplus.extension.service.IService;
import com.spzx.product.api.domain.ProductSku;
import com.spzx.product.api.domain.vo.SkuStockVo;
import com.spzx.product.api.domain.ProductDetails;

import java.util.List;
import java.util.Map;

/**
 * <p>
 * 商品 服务类
 * </p>
 *
 * @author Haoran Sun
 * @since 2024-07-15
 */
public interface ProductService extends IService<Product> {

    /**
     * 根据条件查询商品
     * @param product 查询条件
     * @return  商品列表
     */
    List<Product> listProductByQuery(Product product);

    /**
     * 商品审核
     * @param id 商品id
     * @param auditStatus 要更改的状态
     * @return 更改的行数
     */
    int updateAuditStatus(Long id, Byte auditStatus);

    /**
     * 商品上下架
     * @param id 商品id
     * @param status 要更改的状态
     * @return  更改的行数
     */
    int updateStatus(Long id, Byte status);

    /**
     * 新增商品
     * @param product 商品
     * @return
     */
    int insertProduct(Product product);

    /**
     * 修改商品
     * @param product 商品
     * @return 更改的行数
     */
    int updateProduct(Product product);

    /**
     * 批量删除商品
     * @param ids 商品id列表
     * @return  删除的行数
     */
    int deleteProductByIds(List<Long> ids);

    /**
     * 根据id获取商品信息
     * @param id 商品id
     * @return 商品详细信息
     */
    Product getInfoById(Long id);

    /**
     * 获取销量前20的商品sku数据
     * @return 商品sku数据
     */
    List<ProductSku> getTopSale();

    /**
     * 根据条件查询sku
     * @param skuQuery 查询条件
     * @return sku列表
     */
    List<ProductSku> selectProductSkuList(SkuQuery skuQuery);

    /**
     * 根据skuId获取sku信息
     * @param skuId skuId
     * @return sku信息
     */
    ProductSku getProductSku(Long skuId);

    /**
     * 根据id获取商品信息
     * @param id 商品id
     * @return 商品信息
     */
    Product getProduct(Long id);

    /**
     * 根据skuId获取sku最新价格信息
     * @param skuId skuId
     * @return sku最新价格信息
     */
    SkuPrice getSkuPrice(Long skuId);

    /**
     * 根据id获取商品详细信息
     * @param id 商品id
     * @return 商品详细信息
     */
    ProductDetails getProductDetails(Long id);

    /**
     * 根据id获取商品sku规格信息
     * @param id 商品id
     * @return 商品sku规格信息
     */
    Map<String, Long> getSkuSpecValue(Long id);

    /**
     * 根据skuId获取sku库存信息
     * @param skuId skuId
     * @return sku库存信息
     */
    SkuStockVo getSkuStock(Long skuId);

    /**
     * 根据skuId列表获取sku最新价格信息
     * @param skuIdList skuId列表
     * @return sku最新价格信息
     */
    List<SkuPrice> getSkuPriceList(List<Long> skuIdList);
}
